/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 */
package org.apache.jmeter.protocol.mail.sampler.gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import org.apache.jmeter.gui.util.HorizontalPanel;
import org.apache.jmeter.protocol.mail.sampler.MailReaderSampler;
import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.gui.layout.VerticalLayout;

public class MailReaderSamplerGui extends AbstractSamplerGui {

	// Gui Components
	private JComboBox serverTypeBox;

	private JTextField serverBox;

	private JTextField usernameBox;

	private JTextField passwordBox;

	private JTextField folderBox;

	private JLabel folderLabel;

	private JRadioButton allMessagesButton;

	private JRadioButton someMessagesButton;

	private JTextField someMessagesField;

	private JCheckBox deleteBox;

	// Labels
	private final static String POP3Label = JMeterUtils.getResString("mail_reader_pop3");// $NON-NLS-1$

	private final static String IMAPLabel = JMeterUtils.getResString("mail_reader_imap");// $NON-NLS-1$

    private final static String POP3SLabel = JMeterUtils.getResString("mail_reader_pop3s");// $NON-NLS-1$

    private final static String IMAPSLabel = JMeterUtils.getResString("mail_reader_imaps");// $NON-NLS-1$

	private final static String ServerTypeLabel = JMeterUtils.getResString("mail_reader_server_type");// $NON-NLS-1$

	private final static String ServerLabel = JMeterUtils.getResString("mail_reader_server");// $NON-NLS-1$

	private final static String AccountLabel = JMeterUtils.getResString("mail_reader_account");// $NON-NLS-1$

	private final static String PasswordLabel = JMeterUtils.getResString("mail_reader_password");// $NON-NLS-1$

	private final static String NumMessagesLabel = JMeterUtils.getResString("mail_reader_num_messages");// $NON-NLS-1$

	private final static String AllMessagesLabel = JMeterUtils.getResString("mail_reader_all_messages");// $NON-NLS-1$

	private final static String DeleteLabel = JMeterUtils.getResString("mail_reader_delete");// $NON-NLS-1$

	private final static String FolderLabel = JMeterUtils.getResString("mail_reader_folder");// $NON-NLS-1$

	private static final String INBOX = "INBOX"; // $NON-NLS-1$

	public MailReaderSamplerGui() {
		init();
		initGui();
	}

	public String getLabelResource() {
		return "mail_reader_title"; // $NON-NLS-1$
	}

	/*
	 * (non-Javadoc) Copy the data from the test element to the GUI
	 * 
	 * @see org.apache.jmeter.gui.JMeterGUIComponent#configure(org.apache.jmeter.testelement.TestElement)
	 */
	public void configure(TestElement element) {
		MailReaderSampler mrs = (MailReaderSampler) element;
		if (mrs.getServerType().equals(MailReaderSampler.TYPE_POP3)) {
			serverTypeBox.setSelectedItem(POP3Label);
			folderBox.setText(INBOX);
		} else if (mrs.getServerType().equals(MailReaderSampler.TYPE_POP3S)) {
	            serverTypeBox.setSelectedItem(POP3SLabel);
	            folderBox.setText(INBOX);
        } else if (mrs.getServerType().equals(MailReaderSampler.TYPE_IMAPS)) {
            serverTypeBox.setSelectedItem(IMAPSLabel);
            folderBox.setText(mrs.getFolder());
		} else {
			serverTypeBox.setSelectedItem(IMAPLabel);
			folderBox.setText(mrs.getFolder());
		}
		serverBox.setText(mrs.getServer());
		usernameBox.setText(mrs.getUserName());
		passwordBox.setText(mrs.getPassword());
		if (mrs.getNumMessages() == MailReaderSampler.ALL_MESSAGES) {
			allMessagesButton.setSelected(true);
			someMessagesField.setText("0"); // $NON-NLS-1$
		} else {
			someMessagesButton.setSelected(true);
			someMessagesField.setText(mrs.getNumMessagesString());
		}
		deleteBox.setSelected(mrs.getDeleteMessages());
		super.configure(element);
	}

	/*
	 * (non-Javadoc) Create the corresponding Test Element and set up its data
	 * 
	 * @see org.apache.jmeter.gui.JMeterGUIComponent#createTestElement()
	 */
	public TestElement createTestElement() {
		MailReaderSampler sampler = new MailReaderSampler();
		modifyTestElement(sampler);
		return sampler;
	}

	/*
	 * (non-Javadoc) Modifies a given TestElement to mirror the data in the gui
	 * components.
	 * 
	 * @see org.apache.jmeter.gui.JMeterGUIComponent#modifyTestElement(TestElement)
	 */
	public void modifyTestElement(TestElement te) {
		te.clear();
		configureTestElement(te);

		MailReaderSampler mrs = (MailReaderSampler) te;

		final String item = (String) serverTypeBox.getSelectedItem();
        if (item.equals(POP3Label)) {
			mrs.setServerType(MailReaderSampler.TYPE_POP3);
		} else if (item.equals(POP3SLabel)){
            mrs.setServerType(MailReaderSampler.TYPE_POP3S);
        } else if (item.equals(IMAPSLabel)){
            mrs.setServerType(MailReaderSampler.TYPE_IMAPS);
		} else {
			mrs.setServerType(MailReaderSampler.TYPE_IMAP);
		}

		mrs.setFolder(folderBox.getText());
		mrs.setServer(serverBox.getText());
		mrs.setUserName(usernameBox.getText());
		mrs.setPassword(passwordBox.getText());
		if (allMessagesButton.isSelected()) {
			mrs.setNumMessages(MailReaderSampler.ALL_MESSAGES);
		} else {
			mrs.setNumMessages(someMessagesField.getText());
		}
		mrs.setDeleteMessages(deleteBox.isSelected());
	}

	// TODO - fix GUI layout problems
	
	/*
	 * Helper method to set up the GUI screen
	 */
	private void init() {
		setLayout(new VerticalLayout(5, VerticalLayout.BOTH, VerticalLayout.TOP));
		setBorder(makeBorder());
		add(makeTitlePanel());

		JPanel serverTypePanel = new JPanel();
		serverTypePanel.add(new JLabel(ServerTypeLabel));
		DefaultComboBoxModel serverTypeModel = new DefaultComboBoxModel();
		serverTypeModel.addElement(POP3Label);
        serverTypeModel.addElement(POP3SLabel);
        serverTypeModel.addElement(IMAPLabel);
		serverTypeModel.addElement(IMAPSLabel);
		serverTypeBox = new JComboBox(serverTypeModel);
		serverTypeBox.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				final String item = (String) serverTypeBox.getSelectedItem();
                if (item.equals(POP3Label)||item.equals(POP3SLabel)) {
					folderLabel.setEnabled(false);
					folderBox.setText(INBOX);
					folderBox.setEnabled(false);
				} else {
					folderLabel.setEnabled(true);
					folderBox.setEnabled(true);
				}
			}
		});
		serverTypePanel.add(serverTypeBox);
		add(serverTypePanel);

		JPanel serverPanel = new JPanel();
		serverPanel.add(new JLabel(ServerLabel));
		serverBox = new JTextField(20);
		serverPanel.add(serverBox);
		add(serverPanel);

		JPanel accountNamePanel = new JPanel();
		accountNamePanel.add(new JLabel(AccountLabel));
		usernameBox = new JTextField(20);
		accountNamePanel.add(usernameBox);
		add(accountNamePanel);

		JPanel accountPassPanel = new JPanel();
		accountPassPanel.add(new JLabel(PasswordLabel));
		passwordBox = new JTextField(20);
		accountPassPanel.add(passwordBox);
		add(accountPassPanel);

		JPanel folderPanel = new JPanel();
		folderLabel = new JLabel(FolderLabel);
		folderBox = new JTextField(INBOX, 10);
		folderPanel.add(folderLabel);
		folderPanel.add(folderBox);
		add(folderPanel);

		HorizontalPanel numMessagesPanel = new HorizontalPanel();
		numMessagesPanel.add(new JLabel(NumMessagesLabel));
		ButtonGroup nmbg = new ButtonGroup();
		allMessagesButton = new JRadioButton(AllMessagesLabel);
		allMessagesButton.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				if (allMessagesButton.isSelected()) {
					someMessagesField.setEnabled(false);
				}
			}
		});
		someMessagesButton = new JRadioButton();
		someMessagesButton.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				if (someMessagesButton.isSelected()) {
					someMessagesField.setEnabled(true);
				}
			}
		});
		nmbg.add(allMessagesButton);
		nmbg.add(someMessagesButton);
		someMessagesField = new JTextField(5);
		allMessagesButton.setSelected(true);
		numMessagesPanel.add(allMessagesButton);
		numMessagesPanel.add(someMessagesButton);
		numMessagesPanel.add(someMessagesField);
		add(numMessagesPanel);

		deleteBox = new JCheckBox(DeleteLabel);
		add(deleteBox);
	}

	public void clearGui() {
		super.clearGui();
		initGui();	
	}

	private void initGui() {
		allMessagesButton.setSelected(true);
		//someMessagesButton.setSelected(false);
		//someMessagesField.setText("0");
		deleteBox.setSelected(false);
		folderBox.setText(INBOX);
		passwordBox.setText("");
		serverBox.setText("");
		usernameBox.setText("");
	}
}
